﻿using System.Collections;
using UnityEngine;
//继承MovingObject
public class Enemy : MovingObject {

    public int playerDamage; //对玩家的伤害量

    private Animator animator;
    private Transform target; //玩家的位置信息（利用于AI 寻找玩家并攻击）
    private bool skipMove; //敌人能否移动

    //继承MovingObject的Start方法
    protected override void Start () {

        //********** 修改开始 **********//
        // 因为Start比Awake的执行要晚，保证GameManager里的List实例化完毕后，把自己添加到
        // GameManager中被管理
        //把自己装载到GameManager脚本中的enemyies序列里 
        GameManager.instance.AddEnemyToList (this);
        //********** 修改结束 **********//

        //获取Animator
        animator = GetComponent<Animator> ();
        //先获取Player的对象再获取其transform最终我们要拿取位置信息
        target = GameObject.FindGameObjectWithTag ("Player").transform;
        //调用MovingObject的Start方法
        base.Start ();
    }
    //
    protected override void AttemptMove<T> (int xDir, int yDir) {
        // 执行两次仅有一次能执行下去 为了实现玩家动两次 敌人才动一次的效果
        if (skipMove) {
            skipMove = false;
            return;
        }

        base.AttemptMove<T> (xDir, yDir);
        //移动结束了flag
        

        // 作业3的提示 这里因为是敌人的回合，在尝试移动的函数之后 可以选择在这里攻击
        // Attack()需要什么参数你们自己可以想想
        // 比如是发射子弹（怎么根据方向发射子弹呢。请参考我们的第二节课 飞机大战）
        // 生成子弹对象(至少是个碰撞体)
        
        
        skipMove = true;
    }

    //敌方角色移动用方法　从GameManager调用
    public void MoveEnemy () {
        int xDir = 0;
        int yDir = 0;
        //在同一行(y轴)时
        //Mathf.Abs: 获取距离的绝对值。
        //计算玩家横向距离的绝对值 
        //如果小于0 就是在玩家正上方或者下方（float.Epsilon 科学计数法上一个无限接近0的值）
        if (Mathf.Abs (target.position.x - transform.position.x) < float.Epsilon) {
            //Player在上方+1、下方-1
            yDir = target.position.y > transform.position.y ? 1 : -1;
        } else {
            //Player在右侧+1、左侧的话-1
            xDir = target.position.x > transform.position.x ? 1 : -1;

            // 三元表达式
            /*int i = true ? 0 : 1;

            int i;
            if (true) {
                i =0;
            } else {
                i=1;
            }*/
        }
        //范型机能　攻击対象是只有Player、型的参数就是Player
        AttemptMove<Player> (xDir, yDir);
    }
    //必须实现MovingObject的抽象方法
    protected override void OnCantMove<T> (T component) {
        //获取Player
        Player hitPlayer = component as Player;

        //********** 修改开始 **********//
        animator.SetTrigger ("enemyAttack"); //执行攻击动画
        //********** 修改结束 **********//

        //调用Player类的LoseFood 参数是 对玩家的伤害量
        hitPlayer.LoseFood (playerDamage);
    }

    // 作业3的提示
    void Attack() {
        // 生成子弹对象......
    }


    // 作业4的提示 用OnTriggerEnter
    private void OnTriggerEnter(Collider other) {
        // 碰到玩家制造的某种攻击方法的物体后销毁或者让自己消失
    }
}